package ar.com.age.distribuidora.presentacion.controller;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.LoteDeCompra;
import ar.com.age.distribuidora.dominio.Producto;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class LoteDeCompraBean {

	private String codigoRegistrar;
	
	private String precioRegistrar;
	
	private String cantidadRegistrar;
	
	private Date fechaVencimientoRegistrar;
	
	private Producto productoSeleccionadoRegistrar;
	
	private LoteDeCompra loteDeCompraSeleccionado;  
    
    private LoteDeCompra loteDeCompraSeleccionadoDetalles;
    
    private String 	precioEditar;
    
    private String 	cantidadDeCompraEditar;
    
    private String codigoBuscar;
    
    private String estadoBuscar;
    
    private String productoBuscar;

	private Date fechaDesdeBuscar;
	
	private Date fechaHastaBuscar;
	
	private List<LoteDeCompra> lotesDeCompra;
	
	private List<Producto> productos;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;

	private Producto productoAux;

	private String nombreProducto;
	
	
	public LoteDeCompraBean() {
		
		ValidadorTipoUsuario.validarEmpleadoCompra();

		this.productos = ServiceLocator.getProductoService().buscarTodos();
		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		
	}

	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public Producto getProductoAux() {
		return productoAux;
	}

	public void setProductoAux(Producto productoAux) {
		this.productoAux = productoAux;
	}

	public String getNombreProducto() {
		return nombreProducto;
	}

	public void setNombreProducto(String nombreProducto) {
		this.nombreProducto = nombreProducto;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public String getPrecioRegistrar() {
		return precioRegistrar;
	}

	public void setPrecioRegistrar(String precioRegistrar) {
		this.precioRegistrar = precioRegistrar;
	}

	public String getCantidadRegistrar() {
		return cantidadRegistrar;
	}

	public void setCantidadRegistrar(String cantidadRegistrar) {
		this.cantidadRegistrar = cantidadRegistrar;
	}

	public Date getFechaVencimientoRegistrar() {
		return fechaVencimientoRegistrar;
	}

	public void setFechaVencimientoRegistrar(Date fechaVencimientoRegistrar) {
		this.fechaVencimientoRegistrar = fechaVencimientoRegistrar;
	}

	public Producto getProductoSeleccionadoRegistrar() {
		return productoSeleccionadoRegistrar;
	}

	public void setProductoSeleccionadoRegistrar(
			Producto productoSeleccionadoRegistrar) {
		this.productoSeleccionadoRegistrar = productoSeleccionadoRegistrar;
	}

	public LoteDeCompra getLoteDeCompraSeleccionado() {
		return loteDeCompraSeleccionado;
	}

	public void setLoteDeCompraSeleccionado(LoteDeCompra loteDeCompraSeleccionado) {
		this.loteDeCompraSeleccionado = loteDeCompraSeleccionado;
	}

	public LoteDeCompra getLoteDeCompraSeleccionadoDetalles() {
		return loteDeCompraSeleccionadoDetalles;
	}

	public void setLoteDeCompraSeleccionadoDetalles(
			LoteDeCompra loteDeCompraSeleccionadoDetalles) {
		this.loteDeCompraSeleccionadoDetalles = loteDeCompraSeleccionadoDetalles;
	}

	public String getPrecioEditar() {
		return precioEditar;
	}

	public void setPrecioEditar(String precioEditar) {
		this.precioEditar = precioEditar;
	}

	public String getCantidadDeCompraEditar() {
		return cantidadDeCompraEditar;
	}

	public void setCantidadDeCompraEditar(String cantidadDeCompraEditar) {
		this.cantidadDeCompraEditar = cantidadDeCompraEditar;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public String getProductoBuscar() {
		return productoBuscar;
	}

	public void setProductoBuscar(String productoBuscar) {
		this.productoBuscar = productoBuscar;
	}

	public Date getFechaDesdeBuscar() {
		return fechaDesdeBuscar;
	}

	public void setFechaDesdeBuscar(Date fechaDesdeBuscar) {
		this.fechaDesdeBuscar = fechaDesdeBuscar;
	}

	public Date getFechaHastaBuscar() {
		return fechaHastaBuscar;
	}

	public void setFechaHastaBuscar(Date fechaHastaBuscar) {
		this.fechaHastaBuscar = fechaHastaBuscar;
	}

	public List<LoteDeCompra> getLotesDeCompra() {
		return lotesDeCompra;
	}

	public void setLotesDeCompra(List<LoteDeCompra> lotesDeCompra) {
		this.lotesDeCompra = lotesDeCompra;
	}

	public List<Producto> getProductos() {
		return productos;
	}

	public void setProductos(List<Producto> productos) {
		this.productos = productos;
	}


	// Metodos del Bean

	public String registrarLoteDeCompra() {
		
		LoteDeCompra loteDeCompra = new LoteDeCompra();
		loteDeCompra.setCantidadDeCompra(Double.parseDouble(cantidadRegistrar));
		loteDeCompra.setCantidadActual(Double.parseDouble(cantidadRegistrar));
		loteDeCompra.setCodigo(codigoRegistrar);
		loteDeCompra.setEstado("Disponible");
		loteDeCompra.setFechaVencimiento(fechaVencimientoRegistrar);
		loteDeCompra.setPrecioDeCompra(Double.parseDouble(precioRegistrar));
		loteDeCompra.setProducto(productoSeleccionadoRegistrar);
		
		ServiceLocator.getLoteDeCompraService().crearOEditar(loteDeCompra);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		cantidadRegistrar = null;
		codigoRegistrar = null;
		fechaVencimientoRegistrar = null;
		precioRegistrar = null;
		productoSeleccionadoRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarLoteDeCompra() {
		
		if (this.loteDeCompraSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Lote De Compra",  "Lote de Compra editado con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        this.loteDeCompraSeleccionado.setPrecioDeCompra(Double.parseDouble(precioEditar));
	        this.loteDeCompraSeleccionado.setCantidadDeCompra(Double.parseDouble(cantidadDeCompraEditar));
	        this.loteDeCompraSeleccionado.setCantidadActual(Double.parseDouble(cantidadDeCompraEditar));
	        
	        if (this.loteDeCompraSeleccionado.getProducto() == null) {
	        	this.loteDeCompraSeleccionado.setProducto(this.productoAux);
			}
	        
			ServiceLocator.getLoteDeCompraService().crearOEditar(this.loteDeCompraSeleccionado);
			
			this.productoAux = null;
			this.nombreProducto = null;
			this.productos = ServiceLocator.getProductoService().buscarTodos();
			
			loteDeCompraSeleccionado = null;
			precioEditar = null;
			cantidadDeCompraEditar = null;
			
			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;

			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Lote De Compra",  "No se ha seleccionado un lote de compra.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarLoteDeCompra() {
		
		if (this.loteDeCompraSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			this.productoAux = this.loteDeCompraSeleccionado.getProducto();
			this.nombreProducto = this.loteDeCompraSeleccionado.getProducto().getCodigo();
			
			for(int i = 0; i < productos.size(); i++){
				if (productoAux.getCodigo().equals(productos.get(i).getCodigo())) {
					productos.remove(i);
				}
			}
			
			precioEditar = String.valueOf(this.loteDeCompraSeleccionado.getPrecioDeCompra());
			cantidadDeCompraEditar = String.valueOf(this.loteDeCompraSeleccionado.getCantidadDeCompra());
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarLoteDeCompra() {
		
		if (this.loteDeCompraSeleccionado != null) {

			try {
				ServiceLocator.getLoteDeCompraService().eliminar(this.loteDeCompraSeleccionado);
			} catch (Exception e) {
				
				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
		        RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}
			
			this.loteDeCompraSeleccionado = null;
			
			this.lotesDeCompra = ServiceLocator.getLoteDeCompraService().buscar(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, productoBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarLoteDeCompra() {
		
		
		this.lotesDeCompra = ServiceLocator.getLoteDeCompraService().buscar(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, productoBuscar);

		if (this.lotesDeCompra != null && !this.lotesDeCompra.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.lotesDeCompra = ServiceLocator.getLoteDeCompraService().buscar(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, productoBuscar);
	}
}
